/* eslint-disable @typescript-eslint/no-var-requires */
const path = require('path');
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
// fork-ts-checker-webpack-plugin需要单独安装
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');

module.exports = (options, webpack) => {
  //此处是可以读取到命令中设置的环境变量
  const env = process.env.NODE_ENV;

  console.log(process.env.NODE_ENV, '当前变量');

  return {
    entry: './src/main',
    target: 'node',
    // 置为空即可忽略webpack-node-externals插件
    externals: {},

    // ts文件的处理
    module: {
      rules: [
        {
          test: /\.ts?$/,
          use: {
            loader: 'ts-loader',
            options: { transpileOnly: true },
          },
          exclude: /node_modules/,
        },
        {
          test: /\.(js|ts)$/, // 匹配打包后的 JS/TS 文件
          loader: 'string-replace-loader',
          options: {
            search: 'path.join\\(__dirname, \'../fonts/Comismsh.ttf\'\\)',
            replace: 'path.join(__dirname, \'./assets/fonts/Comismsh.ttf\')',
            flags: 'g', // 全局替换
          },
        },
      ],
    },
    // 打包后的文件名称以及位置
    output: {
      filename: 'main.js',
      path: path.resolve(__dirname, 'dist'),
      publicPath: '/', // 关键：确保资源引用基于 dist 目录
    },
    resolve: {
      extensions: ['.js', '.ts', '.json'],
      alias: {
        '@': path.resolve(__dirname, 'src'), // 将 @ 映射到 src 目录
        'src': path.resolve(__dirname, 'src'), // 将 src 映射到 src 目录
      },
    },
    plugins: [
      // 需要进行忽略的插件
      new webpack.IgnorePlugin({
        checkResource(resource) {
          const lazyImports = [
            '@nestjs/microservices',
            '@nestjs/microservices/microservices-module',
            '@nestjs/websockets/socket-module',
            'cache-manager',
            'class-validator',
            'class-transformer',
            'class-transformer/storage',
          ];
          if (!lazyImports.includes(resource)) {
            return false;
          }
          try {
            require.resolve(resource, {
              paths: [process.cwd()],
            });
          } catch (err) {
            return true;
          }
          return false;
        },
      }),
      new ForkTsCheckerWebpackPlugin(),
      new CopyPlugin({
        patterns: [
          // 从 node_modules/svg-captcha 复制字体到 dist/fonts
          {
            from: path.resolve(__dirname, 'node_modules/svg-captcha/fonts'),
            to: path.resolve(__dirname, 'dist/assets/fonts'),
          },
          // 如果需要复制整个 fonts 目录：
          // {
          //   from: "node_modules/svg-captcha/fonts",
          //   to: "fonts",
          // },
          {
            from: env === 'development' ? 'src/**/development.yml' : 'src/**/production.yml',       // 源路径
            to: '[name][ext]',          // 直接复制到 dist 根目录（去掉子目录）
            noErrorOnMissing: true,     // 忽略文件缺失错误
          },
          // {
          //     from: "Dockerfile",       // 源路径
          //     to: "[name][ext]",          // 直接复制到 dist 根目录（去掉子目录）
          //     noErrorOnMissing: true,     // 忽略文件缺失错误
          // },
          {
            from: 'src/module/common/prisma/client/schema.prisma',       // 源路径
            to: '[name][ext]',          // 直接复制到 dist 根目录（去掉子目录）
            noErrorOnMissing: true,     // 忽略文件缺失错误
          },
          {
            from: 'src/module/common/prisma/client/*.node',       // 源路径
            to: '[name][ext]',          // 直接复制到 dist 根目录（去掉子目录）
            noErrorOnMissing: true,     // 忽略文件缺失错误
          },
          // {
          //     from: ".env*",       // 源路径
          //     to: "[name][ext]",          // 直接复制到 dist 根目录（去掉子目录）
          //     noErrorOnMissing: true,     // 忽略文件缺失错误
          // },

        ],
      }),
      new webpack.DefinePlugin({
        'process.env.env': env, // 确保打包时注入
      }),
    ],
  };
};

